Úvod¶

Projekt z predmetu vizualizácia dát - letný semester 2023, Erik Božík.

Cieľom tohto projektu bolo zodpovedať rôzne otázky ohľadom významných katastrôf, o ktorých máme záznamy. Dáta o katastrofách sú použité z https://data.noaa.gov/metaview/page?xml=NOAA/NESDIS/NGDC/MGG/Hazards/iso/xml/G012153.xml&view=getDataView . Odpovede sú dosiahnuté analyzovaním relevantných vizualizácií, ktoré sú obsahom tohto dokumentu. Konečné odpovede sú následne čo najviac podložené týmito vizualizáciami.

Otázky¶

  1. Kde a kedy sa zemetrasenia diali a akou magnitúdou sa vyznačujú?
  2. Od čoho závisí úmrtnosť zemetrasení?

Spracovanie raw dát¶

Spracovanie úplne pôvodných dát prebiehalo v inom notebooku. Na účely týchto analýz sa dáta načítavajú z githubu v podobe, s ktorou sa ľahko pracuje v pythonovských knižniciach.

In [1]:
# knižnice kvôli načítaniu dát
import zipfile
import requests
import io
# knižnice kvôli vizualizácií a manipulácii s dátami
import numpy as np
import pandas as pd
import geopandas as gpd
import matplotlib.pyplot as plt
import seaborn as sns
import plotly.express as px
# na zobrazovanie v notebooku
from IPython.display import Markdown

Načítanie dát¶

Načítavanie dát z uploadu v githube.

In [2]:
url = 'https://github.com/erikbozik/Earthquakes/raw/main/hazards_geojson.zip'

data = requests.get(url)

with zipfile.ZipFile(io.BytesIO(data.content)) as zip_ref:
    with zip_ref.open('hazards_geojson/earthquakes.geojson', 'r') as file:
        earthquakes = gpd.read_file(file)
        
# ukážka dát
display(Markdown("**Významné Zemetrasenia:**"))
display(earthquakes.head())  
display(earthquakes.shape)

Významné Zemetrasenia:

location magnitude deaths tsunami date year geometry
0 JORDAN: BAB-A-DARAA,AL-KARAK 7.3 NaN 0 -2150/??/?? -2150 POINT (35.50000 31.10000)
1 TURKMENISTAN: W 7.1 Few (~1 to 50 people) 0 -2000/??/?? -2000 POINT (58.20000 38.00000)
2 SYRIA: UGARIT NaN Many (~101 to 1000 people) 1 -2000/??/?? -2000 POINT (35.80000 35.68300)
3 GREECE: THERA ISLAND (SANTORINI) NaN Many (~101 to 1000 people) 1 -1610/??/?? -1610 POINT (25.40000 36.40000)
4 ISRAEL: ARIHA (JERICHO) NaN NaN 0 -1566/??/?? -1566 POINT (35.30000 31.50000)
(5884, 7)

Ďalšie použité dáta:¶

  1. Dáta o krajinách (do týchto dát sa dodatočne dopočítava hustota obyvateľstva): geopandas dataset ('naturalearth_lowres')
  2. Dáta o tektonických doskách: https://github.com/fraxen/tectonicplates
  3. Dáta o mestách: https://simplemaps.com/data/world-cities
In [3]:
# dáta o krajinách
countries = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))
country_areas = countries['geometry'].to_crs({'proj':'cea'}).area  / 1e6
# výpočet hustoty obyvateľstva
countries['area'] = country_areas
density = (countries['pop_est']
           / countries['area'])
countries['pop_dens'] = density
print('countries done')
countries done
In [4]:
# tektonické dosky
url = 'https://github.com/erikbozik/Earthquakes/raw/main/PB2002_plates.json'
plates = gpd.read_file(url)
print('plates done')
plates done
In [5]:
# stiahnute dát o mestách
url_cities = 'https://github.com/erikbozik/Earthquakes/raw/main/worldcities.csv'
cities = pd.read_csv(url_cities)
print('cities done')
cities done

Kde a kedy sa zemetrasenia diali a čím sa vyznačujú?¶

Zemetrasenia a tektonické dosky¶

Všeobecne vieme, že zemetrasenia sa dejú na prelomoch tektonických dosiek. Bližšiu predstavu dostaneme pri vizualizácií zemetrasení a tektonických dosiek

Mapa tektonických dosiek a zemetrasení¶

In [6]:
main = px.choropleth(
    plates,
    geojson=plates['geometry'],
    locations=plates.index,
    color=plates.index,
    color_continuous_scale='Brwnyl',
    projection='mollweide'
)
states = px.choropleth(
    countries,
    locations=countries['iso_a3'],
    color_discrete_sequence=['#ffffff'],
    projection='mollweide'
)

fig = px.scatter_geo(
    earthquakes,
    lat=earthquakes.geometry.y,
    lon=earthquakes.geometry.x,
    hover_name="location",
    hover_data=['magnitude', 'deaths', 'tsunami', 'date'],
    color_discrete_sequence=['#0043a5'],
    projection="mollweide"
)
main.add_trace(states.data[0])
main.add_trace(fig.data[0])
main.update_layout(width=1800, height=1000, coloraxis_showscale=False, geo = dict(showlakes=False), title_text='Zemetrasenia a tektonické dosky')
main.show()

Vyhodnotenie mapy tektonických dosiek a zemetrasení"

Celkom jasne vidieť, že zemetrasenia sa pri určitých zlomoch vyskytujú vo veľkom počte. Nejedná sa však o žiadne striktné pravidlo, vidíme aj zemetrasenia mimo tektonických zlomov. Ďalej sa niektoré časti zlomov javia ako nie príliš aktívne. Môže byť, že na daných zlomoch nedochádza ku vzniku (výrazných) zemetrasení. Všimnúť si však môžeme, že tieto "kľudné" zlomy sa nenachádzajú blízko pevniny. Následne je potom prípustný aj argument, že zemetrasenia mimo obývaných zón sú ťažko detekovateľné a tým pádom nie sú ani súčasťou tohto datasetu. Či sa jedná o neaktívne zóny alebo len o nedetekované zemetrasenia sa nedá rozhodnúť na základe týchto dát.

Zemetrasenia v jednotlivých štátoch¶

V tejto časti skúmame, koľko zemetrasení sa deje v jednotlivých št.

In [7]:
# získanie informácie o krajine zo stĺpca location
most_e = earthquakes.copy(deep=True)
most_e['location'] = most_e['location'].astype(str) 
def country(value):
    index = value.find(':') 
    if index != -1:
        return value[: index]
    else:
        return value
most_e['source_country'] = most_e['location'].apply(country)
In [8]:
# počet pre jednotlivé krajiny za celý čas
counts_all_time = pd.DataFrame(most_e['source_country'].value_counts())
# zobrazíme len viac ako 5
try:
  counts_all_time = counts_all_time.query('`count` > 5')
except:
  counts_all_time = counts_all_time.query('`source_country` > 5')
# display(counts_all_time.head())

Počet zemetrasení za celý čas (od roku 2150 BC)¶

Stĺpcovým diagramom reprezentovaný počet všetkých zemetrasení v krajinách. (pozn.: diagram zachytáva počet väčší ako 5 a je rozdelený na dve časti kvôli čitateľnosti).

In [9]:
# funkcia na označenie grafu - lokálna, funguje len na týchto pár barplotov
def annot(graph, data, index=0):
    height = 0
    for i, rect in enumerate(axes[index].patches):
        try:
            axes[index].text(rect.get_x() + rect.get_width(), height, f'{data["source_country"][i]:.0f}',
                      ha='left', va='center', fontsize=10)
            height += 1
        except KeyError:
            graph[index].text(rect.get_x() + rect.get_width(), height, f'{data["count"][i]:.0f}',
                      ha='left', va='center', fontsize=10)
            height += 1
            
figure, axes = plt.subplots(1, 2, figsize=(35, 15))
# počet vačší, rovný ako 15
temp = counts_all_time.query("`count` >= 15")
ax = sns.barplot(data=temp, x='count', y=temp.index, ax=axes[0], palette="crest_r")
ax.set_title('Počet za celý čas >= 15')
ax.set_xlabel('Počet')
ax.set_ylabel('Krajina')
annot(axes, temp, 0)

# počet menší ako 15
temp = counts_all_time.query("`count` < 15")
ax = sns.barplot(data=temp, x='count', y=temp.index, palette="crest_r", ax=axes[1])
ax.set_title('Počet za celý čas < 15')
ax.set_xlabel('Počet')
ax.set_ylabel('')
annot(axes, temp, 1)

Vyhodnotenie počtu zemetrasení z celý čas:

Jednoznačný líder je Čína. Najbližšie k nej je Irán, no medzi nimi je rozdiel 214 zemetrasení. V prvých 6-tich štátoch sa udialo viac ako 300.

Počet zemetrasení od roku 1900¶

Od začiatku tohto datasetu prešlo dlhé obdobie a bolo by zaujímavé sledovať počet evidovaných zemetrasení v kratšej dobe, bližšej k prítomnosti. Preto nasledujúci diagram je zameraný na zemetrasenia, ktoré sa udiali od roku 1900.

In [10]:
# vyberieme časť dát, ktorá prisluhuje tejto kategórií
counts_last_hundreds = most_e.query("`year` > 1900")
counts_last_hundreds = pd.DataFrame(counts_last_hundreds['source_country'].value_counts())
# zobrazíme len viac ako 5
try:
  counts_last_hundreds = counts_last_hundreds.query('`count` > 5')
except:
  counts_last_hundreds = counts_last_hundreds.query('`source_country` > 5')
display(counts_last_hundreds.shape)
(67, 1)
In [11]:
figure, axes = plt.subplots(1, 2, figsize=(35, 15))
# počet vačší, rovný ako 15
temp = counts_last_hundreds.query("`count` >= 15")
ax = sns.barplot(data=temp, x='count', y=temp.index, ax=axes[0], palette="dark:salmon_r")
ax.set_title('Počet od roku 1900 >= 15')
ax.set_xlabel('Počet')
ax.set_ylabel('Krajina')
annot(axes, temp, 0)

# počet menší ako 15
temp = counts_last_hundreds.query("`count` < 15")
ax = sns.barplot(data=temp, x='count', y=temp.index, palette="dark:salmon_r", ax=axes[1])
ax.set_title('Počet od roku 1900 < 15')
ax.set_xlabel('Počet')
ax.set_ylabel('')
annot(axes, temp, 1)

Vyhodnotenie počtu od roku 1900:

Čína je stále jednoznačný líder. Môže nás však prekvapiť fakt, že od roku -2150 BC do prítomnosti sa udialo v Číne 575 a za posledných 123 rokov 333. Toto si však môžeme všimnúť pri viacerých krajinách. Počet evidovaných zemetrasení od roku 1900 nie je tak výrazne odlišný od počtu za celý čas ako by sme prvotne čakali. Preto je potrebné ďalšia analýza týchto dát aby sme vedeli určiť prečo sa toto deje.

Porovnanie top 10 za celý čas a od roku 1900¶

Následné porovnanie nám určí ako sa menila prvá desiatka. Zároveň si však bližšie budeme môcť všimnúť jednotlivé rozdiely.

In [12]:
figure, axes = plt.subplots(1, 2, figsize=(15, 5))

temp = counts_all_time.iloc[0: 10, :]
ax = sns.barplot(data=temp, x='count', y=temp.index, ax=axes[0], palette="crest_r")
ax.set_title('Top 10 za celý čas')
ax.set_xlabel('Počet')
ax.set_ylabel('Krajina')
annot(axes, temp, 0)

temp = counts_last_hundreds.iloc[0: 10, :]
ax = sns.barplot(data=temp, x='count', y=temp.index, ax=axes[1], palette="dark:salmon_r")
ax.set_title('Top 10 od roku 1900')
ax.set_xlabel('Počet')
ax.set_ylabel('')
annot(axes, temp, 1)
plt.show()
# zistíme rozdiel medzi jednotlivými krajinami
dif = (counts_all_time - counts_last_hundreds).sort_values(by='count', ascending=False).dropna().rename(columns={'count': 'Rozdiel'}).query('`source_country` in @temp.index').reset_index()
dif.rename(columns={
    'source_country': 'Lokácia',
}, inplace=True)

dif['Rozdiel'] = dif['Rozdiel'].astype(int)
dif = dif.transpose()
display(dif)
0 1 2 3 4 5 6 7 8 9
Lokácia CHINA ITALY IRAN TURKEY JAPAN INDONESIA PHILIPPINES CHILE PERU RUSSIA
Rozdiel 242 190 162 148 133 96 88 84 62 31

Vyhodnotenie porovnania:

V týchto grafoch dokážeme prvú desiatku ľahko odsledovať a porovnať prípadné rozdiely. Vidíme, že tak ako bolo načrtnuté v predchádzajúcom závere (5.2.2.1), rozdiely v počte nie sú také výrazné vzhľadom na časové intervaly, ktoré jednotlivé diagramy zachytávajú. V tabuľke pod grafom sú vyznačené konkrétne rozdiely medzi hodnotou za celý čas a od roku 1900. Najlepšie odôvodnenie tohto sa javí ako to, že toto spôsobili pokroky v metódach evidencie. Technologický pokrok, lepšie metódy merania a podobne. Čo sa týka zemetrasení, ktoré sa udiali veľmi dávno, tak máme pravdepodobne len historické záznamy a pri zemetraseniach nedávno už môžeme mať už aj rôzne záznamy z meračov, ktoré vznikli len v minulom storočí.

Vývin v jednotlivých štátoch¶

V ďaľšej vizualizácií je cieľom zistiť vývoj zemetrasení v jednotlivých krajinách a ich prípadné charakteristiky. Použité budú zemetrasenia od roku 1900, práve kvôli tomu, že v tomto období je evidencia dosť obšírna, čo sa ukázalo v diagramoch.

Distribúcia evidencie¶

Dáta z predchádzajúcich diagramov podnietili ďalšiu vizualizáciu, v ktorej by sme vedeli odsledovať koľko zemetrasení pribudlo v jednotlivých časových obdobiach za posledných 123 rokov. Môžeme sledovať ako sa vyvíjal počet evidovaných zemetrasení. Pokiaľ by sa vyskytovali nejaké anomálie v evidencii, tak následné určovanie napríklad toho ako sa v štátoch vyvíja magnitúda nemusia byť valídne.

In [13]:
# vytiahnutie iba top 10 krajin od roku 1900
e_magnitude_trends = most_e.copy(deep=True).query("`year` > 1900 and `magnitude`.notnull()")
# display(e_magnitude_trends)
e_magnitude_trends['date'] = e_magnitude_trends['date'].apply(lambda x: pd.to_datetime(x, format='%Y/%m/%d', errors='coerce'))
e_magnitude_trends['magnitude'] = e_magnitude_trends['magnitude'].astype(float).apply(lambda x: round(x, 2))
magnitude_trends = counts_last_hundreds.copy(deep=True).iloc[0 : 10, :]
magnitude_trends = magnitude_trends.index
In [14]:
figure, axes = plt.subplots(figsize=(10, 10))
temp = e_magnitude_trends.query("`source_country` in @magnitude_trends").rename(columns={'source_country': 'Lokácia epicentra'})
ax = sns.histplot(data=temp, x='date', hue='Lokácia epicentra',
                  multiple='stack', kde=True, bins=12)

ax.set_title('Počet evidovaných zemetrasení v jednotlivých štátoch')
ax.set_ylabel('Počet')
ax.set_xlabel('Rok')
Out[14]:
Text(0.5, 0, 'Rok')

Vývoj počtu evidencie:

Môžeme si hneď všimnúť, že okolo roku 2000 prišlo k výraznému nárastu počtu evidovaných zemetrasení. Toto vieme odargumentovať tak, že v tomto období sa odohral výrazný nárast používania technológií. S týmto následne prišiel aj výrazný pokrok v mnohých oblastiach evidencie údajov, merania údajov. Nárast však možno vidieť aj okolo roku 1960. Okolo tohto roku sa pravdepodobne odohrávali začiatky technologického pokroku. Veľmi zbežne si môžeme všimnúť aj vývin počtu jednotlivých krajín. Na lepšie porovnanie sa v grafe nachádza aj kde (kernel density), ktoré nám môže načrtnúť vývin. Môžeme si všimnúť, že v niektorých rokoch pribudlo v určitých štátoch veľmi málo (výsledný podiel danej krajiny na počte zemetrasení je malý).

KDE evidencie¶

Tento graf nám bližšie približuje prírastok v jednotlivých krajinách nakoľko v predchádzajúcom grafe KDE (kernel density) nie je veľmi vidno, tak aby bolo vhodné na porovnanie. Už vieme, že evidencia stúpala výrazne za posledných 123 rokov. Ďalej zistíme, či to takto prebiehalo v každej krajine a prípadne, ako sa prírastok vyvíjal v čase.

In [15]:
figure, axes = plt.subplots(figsize=(10, 10))

ax = sns.kdeplot(data=temp, x='date', hue='Lokácia epicentra', multiple='stack')
ax
ax.set_ylabel('Pravdepodobnosť (Density)')
ax.set_xlabel('Rok')
axes.axvline(x=pd.to_datetime('1940'), linestyle='--', color='black')

ax.set_title('KDE v jednotlivých štátoch')
Out[15]:
Text(0.5, 1.0, 'KDE v jednotlivých štátoch')

Vyhodnotenie KDE evidencie:

V grafe si môžeme všimnúť, že nárast evidencie nie je vôbec priamočiary. V rôznych krajinách sa na určitých miestach nachádzajú dipy. Obzvlášť zaujímavý je dip okolo roku 1940 (v grafe vyznačený prerušovanou čiarou). Pri viacerých štátoch (Rusko, Japonsko, Turecko) si môžeme všimnúť spád. Vysvetlenie tohto javu je jednoznačné, keďže okolo tohto roku sa odohrávala 2. svetová vojna. Viaceré krajiny museli svoje prostriedky smerovať na financovanie vojny, čo mohlo práve viesť k tomu, že financovanie vedy a aj odvetvia, ktoré má práve na starosti meranie a evidenciu zemetrasení. Dipy sú však individuálne pre každú krajinu. Každá krajina má rôznu históriu a taktiež problémy, ktorými si prechádza. Možné je teda, že počet evidovaných zemetrasení v danej krajine je ovplyvnený rôznou politickou, pandemickou alebo podobnou situáciou.

Zastúpenie magnitúdy v TOP 10 krajinách¶

V nasledujúcich grafoch zistíme aké zastúpenie majú jednotlivé hodnoty magnitúd v TOP 10 krajinách.

In [16]:
# funckie na uľahčenie ďalšej vizualizácie
def gen_xy(rows, cols):
    def gen_x(rows, cols):
        for i in range(rows):
            for j in range(cols):
                yield i
               
    def gen_y(rows, cols):
        for i in range(rows):
            for j in range(cols):
                yield j
    return list(gen_x(rows, cols)), list(gen_y(rows, cols))
In [17]:
grid = (5, 2)
figure, axes = plt.subplots(*grid, figsize=(20, 25), sharex=True, sharey=True)
# pre iteráciu cez grafy
x, y = gen_xy(*grid)

for order, i in enumerate(magnitude_trends):
    data = e_magnitude_trends.query("`source_country` == @i")
    
    ax = sns.histplot(data=data, x='magnitude', ax=axes[x[order], y[order]], kde=True, stat='percent', bins=np.arange(3, 10, 0.2), color='brown')
    ax.set_title(i)
    ax.tick_params(axis='both', which='both', length=10)
    ax.tick_params(labelbottom=True, labelleft=True)
    ax.set_xlabel('Magnitúda')
    ax.set_ylabel('Percento výskytu')
    for rect in ax.patches:
        height = rect.get_height()
        if height != 0:
            ax.annotate(f'{height:.0f}', xy=(rect.get_x() + rect.get_width() / 2, height), xytext=(0, 5),
                        textcoords="offset points", ha='center', va='bottom', fontsize=10)

    ax.set_ylim(0, 19)
    mean = data['magnitude'].mean()
    axes[x[order], y[order]].axvline(x=mean, color='black', linestyle='--', linewidth=0.7)
    axes[x[order], y[order]].text(mean + 0.07, 18, 'Priemer')

Vyhodnotenie zastúpení magnitúdy v krajinách:

Jednoznačne môžeme tvrdiť, že v krajinách môžeme očakávať zemetrasenia s rôznou magnitúdou. Pre porovnanie má napr.: Čína najväčšie zastúpenie okolo magnitúdy 5,5 a Filipíny okolo 7,5. Toto naznačuje, že vieme všeobecne povedať, ktorá krajina je náchylnejšia na silnejšie zemetrasenie a ktorá na slabšie. Určitú predstavu nám dáva aj priemer vyznačený prerušovanou čiarou. Čím ďalej je táto vertikálna čiara položená, tým je priemerná magnitúda vyššia. Vieme si všimnúť aj napríklad to, že napriek tomu, že Čína a Rusko sa nachádzajú pri sebe tak priemerná hodnota magnitúdy je v Číne cca 5,9 a v Rusku cca 7,1, čo sa nezdá ako úplne zanedbateľný rozdiel.

Vývin magnitúdy v čase¶

Ďalej sledujeme, vývin magnitúdy od roku 1900. Špeciálne pozorujeme, či prišlo k nejakému výraznemu nárastu/poklesu v priebehu rokov.

In [ ]:
figure, axes = plt.subplots(5, 2, figsize=(20, 25), sharex=True, sharey=True)

for order, i in enumerate(magnitude_trends):
    data = e_magnitude_trends.query("`source_country` == @i")
    ax = sns.lineplot(data=data, x='date', y='magnitude', ax=axes[x[order], y[order]])
    
    ax.tick_params(axis='both', which='both', length=10)
    ax.tick_params(labelbottom=True, labelleft=True)
    
    mean = data['magnitude'].mean()
    axes[x[order], y[order]].axhline(y=mean, color='black', linestyle='--')
    ax.set_title(f'{i}, Priemer: {round(mean, 2)}')
    ax.set_ylabel('Magnitúda')
    ax.set_xlabel('Rok')

Vyhodnotenie magnitúdy v čase:

Vďaka vyznačenej priemernej hodnote si môžeme všimnúť či sa vývin magnitúdy nejako výrazne menili. Napríklad v Japonsku alebo v Indonézii magnitúdy alternujú viac pod priemernou hodnotou, čím ideme ďalej v čase. V iných krajinách sa zväčša zdá, že sa magnitúdy v priebehu času výrazne nemenia. Pri Japonsku a Indonézii kľudne môže prichádzať k dôsledku vo vyššie spomenutom technologickom pokroku. Je totižto pravdepodobné, že za posledných 30 rokov sme schopní zachytiť oveľa viac zemetrasení s nižšou magnitúdou oproti minulosti.

Mapa tektonických dosiek a top 10 krajín¶

V tejto mape si môžeme všimnúť tektonické dosky (obzvlášť ich hranice) a ďalej TOP 10 krajín spolu s vyznačenými zemetraseniami v nich.

In [ ]:
countries_counts_index = counts_last_hundreds.iloc[0: 10, :].index
e_counts = most_e.query("`source_country` in @countries_counts_index")

countries_counts_index = countries_counts_index.str.lower()


fig = px.scatter_geo(
    e_counts,
    lat=e_counts.geometry.y,
    lon=e_counts.geometry.x,
    hover_name="location",
    hover_data=['magnitude', 'deaths', 'tsunami', 'date'],
    color_discrete_sequence=['#0043a5'],
    projection="mollweide"
)

countries2 = countries.copy(deep=True)
countries2['name'] = countries2['name'].str.lower()
countries2 = countries2.query("`name` in @countries_counts_index")


main = px.choropleth(
    plates,
    geojson=plates['geometry'],
    locations=plates.index,
    color=plates.index,
    color_continuous_scale='Brwnyl',
    projection='mollweide'
)

states = px.choropleth(
    countries2,
    locations=countries2['iso_a3'],
    color_discrete_sequence=['#ffffff'],
    projection='mollweide'
)

main.add_trace(fig.data[0])
main.add_trace(states.data[0])

main.update_layout(width=1800, height=1000, geo = dict(showlakes=False),
                   coloraxis_showscale=False, title_text='TOP 10 krajín a tektonické dosky')

main.show()

Vyhodnotenie TOP 10 krajín a tektonické dosky:

Krajiny v Ázií a Čile v Južnej Amerike sa nachádzajú v blízkosti tektonického zlomu. Čo si však môžeme všimnúť je, že v Rusku a v Taliansku sa dejú zemetrasenia aj na miestach, ktoré nie sú úplne na rozhraní tektonických zlomov. V západnej časti Rusku sa diali zemetrasenia na miestach, od ktorých je zlom ďaleko. V Taliansku sa zemetrasenia diali po celom území napriek tomu, že pri zlome sa nachádza len Sicília. Tieto zemetrasnia mohol teda spôsobiť iný vplyv.

Záver¶

Tektonické dosky majú vplyv na vznik zemetrasení, čiže toto sa veľmi jednoznačne podarilo potvrdiť. Avšak zemetrasenia môžu spôsobiť aj iné vplyvy, čo si vieme všimnúť pri bodoch, ktoré sa nachádzajú mimo zlomov. (5.1.1)

Ďalej sme si mohli všimnúť, že dlhodobým lídrom v počte zemetrasení je Čína (5.2). Pozorovaním počtu evidovaných zemetrasení bolo taktiež vidno aj to, že počet zemetrasení, ktoré evidujeme sa výrazne zvyšuje, čím ideme bližšie k prítomnosti (6.3.1), (5.3.2). Toto sa javí ako pokrok evidencie vďaka vývoju technológií. Taktiež sa však javí, že to koľko zemetrasení evidujeme v jednotlivých krajinách závisí aj od toho v akej situácií sa daná krajina nachádza. Počas druhej svetovej vojny totižto vnímame pokles v evidencii vo viacerých krajinách (5.3.2).

Čo sa týka magnitúd v jednotlivých štátoch tak vieme povedať, že v rôznych krajinách sa vyskytujú zemetrasenia s rôznymi rozsahmi magnitúd. Napríklad v Taliansku je šanca na zemetrasenie s mag. väčšou ako 7 veľmi malá. Naopak v Chile je pravdepodobnosť na takéto zemetrasenie celkom výrazná (5.3.3). Keď konkrétne tieto dve krajiny porovnáme na základe polohy ku tektonickým doskám, tak si všimneme, že Taliansko sa nenachádza pri výrazných zlomoch ale Chile sa nachádza veľmi blízko ku zlomu. Zároveň väčšina krajín s vysokým počtom sa nachádza pri tektonických zlomoch. (5.3.5) Čo sa týka vývoja magnitúdy počas posledných 123 rokov, tak nejaké výrazné zmeny nepozorujeme. (5.3.4)

Od čoho závisí úmrtnosť zemetrasení?¶

Magnitúda a úmrtia¶

V nasledujúcich blokoch sú porovnané úmrtia a magnitúda zemetrasení. Zemetrasenia, ku ktorým nie sú údaje o počte úmrtí a magnitúde zanedbávame.

Boxplot rozsahu magnitúd pred danú úmrtnosť¶

Tento boxplot ukazuje ako sú rozptýlené hodnoty magnitúd pre jednotlivú úmrtnosť. Táto vizualizácia je vhodná, pretože počet úmrtí nie je v dátach určený presným číslom ale rozsahom, čo dovoľuje jednotlivé zemetrasenia zaradiť do kategórií.

In [ ]:
earthquakes1 = earthquakes.copy(deep=True).query("`magnitude`.notnull() and `deaths`.notnull()")
def deaths_parse(value):
    if value is not np.nan:
        index = value.find('(')
        key, value = value[: index].strip(), value[index + 2:]
        ran = ()
        for i in value.split():
             try:
                 ran += int(i),
             except ValueError:
                 pass
        if len(ran) != 2:
            out = (ran[0], '>')
        else:
            out = (ran[0], ran[1])
        return out
    return value


earthquakes1['deaths'] = earthquakes1['deaths'].apply(deaths_parse)
earthquakes1['magnitude'] = earthquakes1['magnitude'].astype(float)
earthquakes1 = earthquakes1.sort_values(by='deaths')
earthquakes1['deaths'] = earthquakes1['deaths'].apply(lambda x: f'{x[0]} - {x[1]}' if x[1] != '>' else f'{x[0]}>')

figure, axes = plt.subplots(figsize=(10, 10))
e_death_scatter = sns.boxplot(data=earthquakes1, x='deaths', y='magnitude')
e_death_scatter.set_title('Výskyt jednotlivých magnitúd pre daný rozsah úmrtnosti')
e_death_scatter.set_xlabel('Úmrtia')
e_death_scatter.set_ylabel('Magnitúda')

Vyhodnotenie boxplotu

Môžeme vidieť, že jednotlivé rozsahy boxov sa nachádzajú tým vyššie, čím je väčšia úmrtnosť. Toto naznačuje, že väčšina zemetrasení s nízkou úmrtnosťou sa nachádza v nižších magnitúdach oproti tým s vyššou úmrtnosťou. Okrem položenia jednotlivých boxov si tento fakt môžeme všimnúť aj mediánom vyznačeným v jednotlivých boxoch. Nejedná sa však o žiadne striktné pravidlo, čo môžeme vidieť rozsahom, v ktorom sa nachádza dolných 25% a horných 25% dát. Hlavne pri najnižšej úmrtnosti je tento rozsah dosť obšírny. Okrem tohto si však môžeme všimnúť aj pár outlierov pri jednotlivých kategóriách úmrtnosti. Rozsah pri úmrtiach 51-100 a 101-1000 sa zdajú byť celkom podobné. Vyzerá to tak, že nejaký vplyv magnitúdy na úmrtnosť sa vyskytuje.

Violinplot na zistenie rozsahov¶

Vizualizácia violinplotom je ako doplnok k boxplotu. Cieľom tejto konkrétnej vizualizácie je dať bližšiu predstavu o tom koľko zemetrasení s danou úmrtnosťou sa nachádza v určitej magnitúde.

In [ ]:
figure, axes = plt.subplots(figsize=(10, 10))
earthquakes1['magnitude'] = earthquakes1['magnitude'].astype(float) 


e_death_violin = sns.violinplot(data=earthquakes1, x='deaths', y='magnitude', inner='points')

e_death_violin.set_title('Výskyt jednotlivých magnitúd pre daný rozsah úmrtnosti')
e_death_violin.set_xlabel('Úmrtia')
e_death_violin.set_ylabel('Magnitúda')

Vyhodnotenie violinplotu:

Violin plot nám v podstate ukázal podobné údaje ako v boxplote. Tu však úplne nevidíme v ktorých rozsahoch sa nachádza najviac zemetrasení (toto ukázal boxplot). Pozorujeme však šírku jednotlivých kategórií. Časť grafu, ktorá reprezentuje málo úmrtí má celkom značné zastúpenie vo vyšších magnitúdach. Toto naznačuje, že na úmrtnosť sú aj ďalšie vplyvy ako len prosto magnitúda. Znova si môžeme všimnúť podobnosť rozsahi 51-100 a 101-1000.

Mapy¶

Mapa nízkej úmrtnosti a vysokej magnitúdy po roku 1950¶

Následujúca vizualizácia sa konkrétne zameriava na časť zemetrasení, ktoré majú vysokú magnitúdu (magnitúda > 7,5) ale malú úmrtnosť (1-50), nakoľko táto časť zemetrasení sa vo violin plote javila ako celkom obšírna. Tieto zemetrasenia sú zobrazené na mape sveta vzhľadom na hustotu obyvateľstva. Cieľom je sledovať polohu epicentra, keďže predpokladáme, že sa nachádzajú mimo častí s vysokou hustotou. Aby sa ako tak zachovala relevantnosť dát o hustote obyvateľstva tak zvizualizované sú len zemetrasenia od roku 1950, ktoré spĺňajú túto kategóriu.

In [ ]:
high_magnitude_low_deaths = earthquakes1.copy(deep=True).query("`magnitude` > 7.5 and `deaths` == '1 - 50' and year > 1950")

main = px.choropleth(
    countries,
    locations=countries['iso_a3'],
    color='pop_dens',
    color_continuous_scale='Blues',
    range_color=(0, 250),
    projection='mollweide',
    title='Nízka úmrtnosť, vysoká magnitúda vzhľadom na hustotu obyvateľstva',
    labels={'pop_dens': 'Hustota obyvateľstva/km^2'}
)
fig = px.scatter_geo(
    high_magnitude_low_deaths, 
    lat=high_magnitude_low_deaths.geometry.y,
    lon=high_magnitude_low_deaths.geometry.x,
    hover_name="location",
    hover_data=['magnitude', 'deaths', 'tsunami', 'date'],
    color_discrete_sequence=['#cb0000'],
    projection="mollweide"
    )
main.add_trace(fig.data[0])

main.update_layout(width=1800, height=900, geo = dict(showlakes=False))
main.show()

Vyhodnotenie mapy:

Tvrdiť, že silné zemetrasenia s malou úmrtnosťou sa nedejú v krajinách s vysokou hustotou zaľudnenia tvrdiť nemôžeme. Avšak môžeme si všimnúť, že tieto zemetrasenia sú lokalizované (až na pár výnimiek) na pobrežiach, prípadne v mori a nie vo vnútrozemí.

Mapa nízkej úmrtnosti, vysokej magnitúdy v kombinácii s mestami po roku 1950¶

Cieľom je sledovať rovnakú kategóriu zemetrasení ako v predchádzajúcom grafe s tým rozdielom, že v tomto grafe budeme sledovať mestá s populáciou väčšou ako 500 000. Sledovať budeme len kontinenty s výrazným zastúpením zemetrasení patriacich do tejto kategórie.

In [ ]:
e_cop = earthquakes.copy(deep=True).query("`deaths`.notnull()")
e_cop['deaths'] = e_cop['deaths'].apply(deaths_parse)
e_cop.magnitude = e_cop.magnitude.astype(float)
e_cop['deaths'] = e_cop['deaths'].apply(lambda x: f'{x[0]} - {x[1]}' if x[1] != '>' else f'{x[0]}>')

main = px.choropleth(
    countries,
    locations=countries['iso_a3'],
    color_discrete_sequence=['#ffffff'],
    projection='mollweide'
)

cities_to_scatter = cities.copy(deep=True).query("`population` > 500000")
towns = px.scatter_geo(
    cities_to_scatter,
    lat=cities_to_scatter.lat,
    lon=cities_to_scatter.lng,
    hover_name='city',
    hover_data=['country', 'population'],
    projection='mollweide'
)

deaths_earthquakes = e_cop.copy(deep=True).query("`magnitude` > 7.5 and `deaths` == '1 - 50' and year > 1950")
deaths = px.scatter_geo(
    deaths_earthquakes,
    lat=deaths_earthquakes.geometry.y,
    lon=deaths_earthquakes.geometry.x,
    hover_name='date',
    hover_data=['deaths'],
    color_discrete_sequence=['#cb0000'],
    projection='mollweide'
)

main.add_trace(towns.data[0])
main.add_trace(deaths.data[0])
main.update_layout(width=1800, height=1000, showlegend=True, geo = dict(showlakes=False), title_text='Nízka úmrtnosť, vysoká magnitúda vzhľadom na mestá')
main.show()

Vyhodnotenie mapy nízkej umrtnosti, veľkej magnitúdy na mestá:

Môžeme si všimnúť, že tieto zemetrasenia sa nenachádzajú úplne pri mestách s populáciou väčšou ako 500 000. V Japonsku je to krásne vidno. Podobne aj napríklad v Taiwane sú tieto zemetrasenia mimo takýchto miest. Podobne aj v iných štátoch je toto vidieť.

Mapa vysokej úmrtnosti a hustoty obyvateľstva po roku 1950¶

Cieľom je vizualizovať veľmi podobne ako v predchádzajúcej mape (6.2.1) polohu epicentra vzhľadom na hustotu obyvateľstva s tým rozdieľom, že v tejto mape je zameranie na zemetrasenia po roku 1950 s vysokou úmrtnosťou.

In [ ]:
e_high_deaths = earthquakes1.query("`deaths` == '1001>' and `year` > 1950")
main = px.choropleth(
    countries,
    locations=countries['iso_a3'],
    color='pop_dens',
    color_continuous_scale='Blues',
    range_color=(0, 250),
    projection='mollweide',
    labels={'pop_dens': 'Hustota\nzaľudnenia/km^2'},
    title='Zemetrasenia s vysokou úmrtnosťou vzhľadom na hustotu obyvateľstva'
)
fig = px.scatter_geo(
    e_high_deaths, 
    lat=e_high_deaths.geometry.y,
    lon=e_high_deaths.geometry.x,
    hover_name="location",
    hover_data=['magnitude', 'deaths', 'tsunami', 'date'],
    color_discrete_sequence=['#cb0000'],
    projection='mollweide'
    )
main.add_trace(fig.data[0])
main.update_layout(width=1800, height=1000, geo = dict(showlakes=False))
main.show()

Vyhodnotenie mapy vysokej úmrtnosti vzhľadom na hustotu obyvateľstva: Oproti predchádzajúcim mapám si môžeme všimnúť ako sa tieto zemetrasenia dejú vo vnútrozemí. Zároveň keď si všimneme Indiu, Čínu, Turecko, to sú všetko štáty s vyššou hustotou zaľudnenia. Zaujímavé je však si všimnúť zemetrasenie na Kamčatke, pretože na tomto istom mieste sa stalo zemetrasenie, čo malo vysokú magnitúdu a nízku úmrtnosť.

Mapa vysokej úmrtnosti v kombinácii s mestami po roku 1950¶

Vizualizácia zemetrasení s vysokou úmrtnosťou vzhľadom na mestá s populáciou vyššou ako 500 000 obyvateľov. Podobne ako v 6.2.2.

In [ ]:
main = px.choropleth(
    countries,
    locations=countries['iso_a3'],
    color_discrete_sequence=['#ffffff'],
    title='Vysoká úmrtnosť vzhľadom na mestá',
    projection='mollweide'
)

cities_to_scatter = cities.copy(deep=True).query("`population` > 500000")
towns = px.scatter_geo(
    cities_to_scatter,
    lat=cities_to_scatter.lat,
    lon=cities_to_scatter.lng,
    hover_name='city',
    hover_data=['country', 'population'],
    projection='mollweide'
)

deaths_earthquakes = e_cop.copy(deep=True).query("`deaths` == '1001>' and year > 1950")
deaths = px.scatter_geo(
    deaths_earthquakes,
    lat=deaths_earthquakes.geometry.y,
    lon=deaths_earthquakes.geometry.x,
    hover_name='date',
    hover_data=['deaths'],
    color_discrete_sequence=['#cb0000'],
    projection='mollweide'
)

main.add_trace(towns.data[0])
main.add_trace(deaths.data[0])
main.update_layout(width=1800, height=900, geo = dict(showlakes=False))
main.show()

Vyhodnotenie mapy vysokej úmrtnosti vzhľadom na mestá:

Čoraz viac si môžeme všimnúť ako sa body zvýrazňujúce zemetrasenia nachádzajú pri mestách s populáciou väčšou ako 500 000. Tento fakt je krásne vidno v štátoch ako Turecko, Čína (až na jednu výnimku), Japonsko.

Záver¶

Čo sa týka úmrtnosti zemetrasení tak veľkosť magnitúdy má určitý vplyv na počet mŕtvych. Zemetrasenie s vyššou mag. má väčší potenciál na to aby zabilo viacero ľudí ako zemetrasenie s nižšou (6.1). Avšak si treba uvedomiť, že ak sa udeje zemetrasenie niekde v oceáne, aj keby má vysokú magnitúdu, tak je pravdepodobné, že si vyžiada málo, až 0 obetí. Na malú úmrtnosť kľudne stačí aby sa aj silné zemetrasenie stalo pri pobreží (6.2.1 a 6.2.2). Môžeme tvrdiť, že zemetrasenia, ktoré sa dejú v alebo pri mestách s veľkou populáciou sú oveľa viac náchylnejšie na to aby vyvolali veľa úmrtí (6.2.4 a (6.2.2).